﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

#include "GmepCommonSettings.h"
#include <chrono>
#include "GbmpTypeDefs.h"
#include "RuntimeId.h"
#include "Any.h"
#include "CommandParameters.h"

#define GMEP_LOGIN_TO_CLOSE     10000 //协同登录-to-关闭软件
#define GMEP_STRAT_TO_LOGIN     10001 //弹出启动界面-to-显示登录界面
#define GMEP_FIRST_OPEN_VIEW    10011 //首次打开视图-to-视图已打开
#define GMEP_SWITCH_VIEW        10012 //切换视图-to-切换视图完成 （平面 立面 三维 剖面）
#define GMEP_SWITCH_DETAILLEVEL 10013 //切换详细程度-to-切换详细程度完成
#define GMEP_CREATE_LOCALVIEW   10014 //创建局部三维视图-to-局部三维视图创建完成
#define GMEP_DATA_FIX   900010 //数据恢复

#define GMEP_SHOW_PROJECT_COMPONENT_WINDOW 10016 //打开项目构件管理界面-to-构件管理打开
#define GMEP_EDIT_PROJECT_COMPONENT        10017 //构件编辑-to-编辑完成
#define GMEP_CLOSE_WORKUNIT                10005 //关闭工作单元
#define GMEP_SUBMIT_WORKUNIT               10007 //提交工作单元-to-屏幕上出现“数据已完成处理”的提示
#define GMEP_OPEN_WORKUNIT                 10003 //打开工作单元；由点击“工作单元”到工作单元打开
#define GMEP_SHOW_WINDOW_OF_LEVELANDGRID_OF_SUBMIT   10008 //提交工作单元中的弹窗  由出现未提交至项目的轴网、标高弹窗-to-点击确定

#pragma region 建模操作,埋点
// fngroup 建模操作
#define GMEP_RECORD_FNGROUP_MODELING GBMP_TR(L"建模操作")

#define GMEP_RECORD_CMDID_COMMITEXIT_DUCT GBMP_TR(L"绘制风管结束")
#define GMEP_RECORD_CODE_DUCT 10018

#define GMEP_RECORD_CMDID_COMMITEXIT_PIPE GBMP_TR(L"绘制管道结束")
#define GMEP_RECORD_CODE_PIPE 10019

#define GMEP_RECORD_CMDID_COMMITEXIT_CABLETRAY GBMP_TR(L"绘制桥架结束")
#define GMEP_RECORD_CODE_CABLETRAY 10020

#define GMEP_RECORD_CMDID_COMMITEXIT_WIRE GBMP_TR(L"绘制导线结束")
#define GMEP_RECORD_CODE_WIRE 10021

#define GMEP_RECORD_CMDID_COMMITEXIT_AUTOCONNECT GBMP_TR(L"连接成功")
#define GMEP_RECORD_CODE_AUTOCONNECT 10022
//
//#define GMEP_RECORD_CMDID_COMMITEXIT_TERMINAL GBMP_TR(L"放置风口结束")
//#define GMEP_RECORD_CODE_TERMINAL 10023
//
//#define GMEP_RECORD_CMDID_COMMITEXIT_HYDRANT GBMP_TR(L"放置消火栓结束")
//#define GMEP_RECORD_CODE_HYDRANT 10024
//
//#define GMEP_RECORD_CMDID_COMMITEXIT_LIGHTING GBMP_TR(L"放置灯具结束")
//#define GMEP_RECORD_CODE_LIGHTING 10025
//
//#define GMEP_RECORD_CMDID_COMMITEXIT_DISTRIBUTION GBMP_TR(L"放置配电箱结束")
//#define GMEP_RECORD_CODE_DISTRIBUTION 10026

#define GMEP_RECORD_CMDID_COMMITEXIT_HYDRANTCONNECT GBMP_TR(L"消火栓连接成功")
#define GMEP_RECORD_CODE_HYDRANTCONNECT 10027

#define GMEP_RECORD_CMDID_COMMITEXIT_WIRECONNECT GBMP_TR(L"导线连接成功")
#define GMEP_RECORD_CODE_WIRECONNECT 10028


#define GMEP_RECORD_CMDID_COMMITEXIT_REALLAYDONE_TERMINAL GBMP_TR(L"风口布置完成")
#define GMEP_RECORD_CODE_REALLAYDONE_TERMINAL 10036

#define GMEP_RECORD_CMDID_COMMITEXIT_REALLAYDONE_HYDRANT GBMP_TR(L"消火栓布置完成")
#define GMEP_RECORD_CODE_REALLAYDONE_HYDRANT 10037

#define GMEP_RECORD_CMDID_COMMITEXIT_REALLAYDONE_LIGHTING GBMP_TR(L"灯具布置完成")
#define GMEP_RECORD_CODE_REALLAYDONE_LIGHTING 10038

#define GMEP_RECORD_CMDID_COMMITEXIT_REALLAYDONE_DISTRIBUTION GBMP_TR(L"配电箱布置完成")
#define GMEP_RECORD_CODE_REALLAYDONE_DISTRIBUTION 10039

#define GMEP_FUNCOP_ENTRY1 GBMP_TR(L"功能按钮/快捷键触发")
#define GMEP_FUNCOP_ENTRY2 GBMP_TR(L"空格键命令触发")
#define GMEP_FUNCOP_ENTRY3 GBMP_TR(L"右键创建类似实例触发")
#define GMEP_FUNCOP_ENTRY4 GBMP_TR(L"点击管道+绘制")
#define GMEP_FUNCOP_ENTRY5 GBMP_TR(L"构件树布置")
#define GMEP_FUNCOP_ENTRY6 GBMP_TR(L"项目构件管理布置")
#define GMEP_FUNCOP_ENTRY7 GBMP_TR(L"构件坞插件布置")
#pragma endregion 建模操作,埋点

#pragma region 通用性能,埋点
// fngroup 通用性能
#define GMEP_RECORD_FNGROUP_COMMON GBMP_TR(L"通用性能")

#define GMEP_DELETECMD_TO_COMMITEXIT 10029 //删除命令触发-to-删除事务提交
#define GMEP_MOVECMD_TO_COMMITEXIT   10030 //移动命令触发-to-移动事务提交
#define GMEP_COPYCMD_TO_COMMITEXIT   10031 //复制命令触发-to-复制事务提交

#define GMEP_RECORD_CMDID_COMMITEXIT_ANNOTATION GBMP_TR(L"单个标注完成")
#define GMEP_RECORD_CODE_ANNOTATION 10032
//引出绘制暂时取消
//#define GMEP_RECORD_CMDID_COMMITEXIT_EXPORTDRAW GBMP_TR(L"引出绘制完成")
//#define GMEP_RECORD_CODE_EXPORTDRAW 10033
#define GMEP_RECORD_CMDID_COMMITEXIT_ONLINETXT GBMP_TR(L"绘制管线文字完成")
#define GMEP_RECORD_CODE_ONLINETXT 10034
#pragma endregion 通用性能,埋点

namespace gmep
{
    class GMEP_COMMONSETTINGS_EXPORT GmepRecordTimeUtils
    {
    public:
        /// \ brief 类构造计时开始
        /// \return
        static void RecordClassNewStartTime();
        /// \ brief 类析构计时结束
        /// \param commandId 埋点配置消息
        /// \param group 埋点组
        /// \return 返回时长 单位秒
        static double RecordClassDestroyEndTimeAndGetDuration(const std::wstring & commandId, const std::wstring & group);
        
        /// \ brief 统计业务功能服务计时开始
        /// \param funCode 埋点code
        /// \return 
        static void RecordFunctionalServicesStartTime(const Int32& funCode);
        /// \ brief 统计业务功能服务计时结束  
        /// \param funCode 埋点code
        /// \return 返回时长 单位秒
        static double RecordFunctionalServicesEndTimeAndGetDuration(const Int32& funCode);
        /// \ brief 统计业务功能服务计时结束
        /// \param commandId 埋点配置消息
        /// \param group 埋点组
        /// \param funCode 埋点code
        /// \param extensibleData 扩展数据，例如：时长 名称等
        /// \return
        static void RecordFunctionalServicesEndTimeAndGetDuration(const std::wstring & commandId, const std::wstring & group, const Int32& funCode, std::map<std::wstring, gcmp::Any>& extensibleData = std::map<std::wstring, gcmp::Any>());
        /// \ brief 统计业务功能服务计时结束
        /// \param commandId 埋点配置消息
        /// \param group 埋点组
        /// \param funCode 埋点code
        /// \param invalidDuration 持续的无效时间
        /// \param extensibleData 扩展数据，例如：时长 名称等
        /// \return
        static void RecordFunctionalServicesEndTimeAndGetDuration(const std::wstring & commandId, const std::wstring & group, const Int32& funCode, const double invalidDuration, std::map<std::wstring, gcmp::Any>& extensibleData = std::map<std::wstring, gcmp::Any>());


        /// \ brief 统计启动软件到关闭软件计时开始  
        /// \param  AppId 应用标识
        /// \return
        static void RecordApplicationStartTime(const Int32& AppId);

        /// \ brief 统计启动软件到关闭软件计时结束  
        /// \param  AppId 应用标识
        /// \return 返回时长 单位秒
        static double RecordApplicationEndTimeAndGetDuration(const Int32& AppId);


        /// \ brief 统计单次从创建/打开项目到关闭项目的总时长计时开始  
        /// \param  docId 运行doc标识
        /// \return 
        static void RecordCollaborationDocumentStartTime(const gcmp::RuntimeId& docId);

        /// \ brief 统计单次从创建/打开项目到关闭项目的总时长计时结束 
        /// \param  docId 运行doc标识
        /// \return 返回时长 单位秒
        static double RecordCollaborationDocumentEndTimeAndGetDuration(const gcmp::RuntimeId& docId);

        /**
         *  \brief GHMEP-31422 区分实现同一功能的不同入口
         *  \param cmdParams 功能入口标识参数
         *  \param cmdId 消息Id
         */
        static void RecordFunctionalModuleEntry(const gcmp::CommandParameters & cmdParams, const std::wstring& cmdId);

        /**
         *  \brief 通过参数约定操作名称
         *  \param cmdParams 功能入口标识参数
         *  \param cmdId 消息Id
         */
        static const std::wstring GetFunctionalModuleOperationName(const gcmp::CommandParameters & cmdParams, const std::wstring& cmdId);
    private:
        static __time64_t _time;
        static std::unordered_map<Int32, __time64_t> s_mapFunStartTime;
        static std::unordered_map<Int32, __time64_t> s_mapAppStartTime;
        static std::unordered_map<Int32, __time64_t> s_mapCollaborationDocStartTime;
    };
}
